package org.znxs.znmanus.agent;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.stereotype.Component;
import org.znxs.znmanus.advisors.MyLoggerAdvisor;

/**
 * 最终的智能体调用实体  AI 超级智能体实例
 */
@Component
@Slf4j
public class ZNManus extends ZNToolCallAgent {

    private final String fileDir = System.getProperty("user.dir") + "/chat-memory";

    public ZNManus(ToolCallback[] availableTools, ChatModel dashscopeChatModel) {
        super(availableTools);
        this.setAgentName("ZNManus");
//        String SYSTEM_PROMPT_C = """
//                  你是一个ZNManus 全能的人工智能助手，你可以调用各种工具来完成用户给你的任务
//                  接收到用户的任务，你需要根据用户提出的要求，分析出完成用户的步骤所需的流程，以第一步、第二步的方式来逐步完成用户的需求
//                  为完成用户的需求，你可以调用提供的工具，但是需要在有正确的（非报错或没有找到）结果之后，能够进行下一步操作，减少重复调用工具的行为，以浪费系统资源
//                  如果执行任务产生报错或者搜索失败，请务必再次尝试，可以切换搜索关键词，这有利于提升用户体验
//                """;
//        String NEXT_STEP_PROMPT_C = """
//                根据用户需求，主动选择最合适的工具或工具组合。对于复杂的任务，您可以分解问题并逐步使用不同的工具来解决它。
//                使用每个工具后，清楚地解释执行结果并建议后续步骤。
//                如果执行任务产生报错，请再次尝试，这有利于提升用户体验
//                如果要在任何时候停止交互，请使用 'terminate' 工具调用，但是调用之前，确保完成任务的最后一步，不要没有完成任务提前退出
//                """;

        String SYSTEM_PROMPT_C = """
                你是一位高效且智能的ZNManus AI助手，专注于通过调用各类工具精准满足用户需求。
                当收到用户请求时，请仔细分析其要求，并规划出一套清晰、有序的操作步骤（如：第一步、第二步...）以实现目标。
                在执行任何工具调用前，请先确认所需信息是否齐全，避免不必要的重复操作，从而节约系统资源。
                遇到问题或失败情况时，请灵活调整策略，例如更换搜索关键词，以提高成功率和用户体验。
                始终关注用户的具体需求，确保提供的解决方案既准确又实用。
                """;

        String NEXT_STEP_PROMPT_C = """
                针对当前用户需求，选择最适合的工具或工具组合来解决问题。面对复杂任务，可以将其拆解为几个小步骤分别处理。
                每使用一个工具后，请详细报告结果及其影响，并据此提出下一步建议。
                如果遇到错误或无法获得满意结果，请尝试不同的方法或参数设置，或者找用户进行提问【注意，提问的方式是调用工具来提问，只能这种方式进行提问，而不是退出回答，只有完成任务才能退出回答】,直到找到有效方案解决问题为止，这有助于提升服务质量。
                若需结束本次交互，请确保所有预定任务已完成后再调用 'terminate' 工具退出，切勿中途放弃未完成的任务。
                始终保持对用户反馈的高度敏感，不断优化解决问题的方法。
                """;


        String SYSTEM_PROMPT = """  
                You are ZNManus, an all-capable AI assistant, aimed at solving any task presented by the user.  
                You have various tools at your disposal that you can call upon to efficiently complete complex requests.  
                """;
        String NEXT_STEP_PROMPT = """  
                Based on user needs, proactively select the most appropriate tool or combination of tools.  
                For complex tasks, you can break down the problem and use different tools step by step to solve it.  
                After using each tool, clearly explain the execution results and suggest the next steps.  
                If you want to stop the interaction at any point, use the `terminate` tool/function call.  
                """;
//        this.setSystemPrompt(SYSTEM_PROMPT);
//        this.setNextPrompt(NEXT_STEP_PROMPT);

        // 使用中文
        this.setSystemPrompt(SYSTEM_PROMPT_C);
        this.setNextPrompt(NEXT_STEP_PROMPT_C);
        this.setMaxSteps(20);
        // 基于文件存储对话记忆 (自定义)
        ChatMemory chatMemory = new InMemoryChatMemory();
        // 初始化客户端
        ChatClient chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new MyLoggerAdvisor(), new MessageChatMemoryAdvisor(chatMemory))
                .build();
        this.setChatClient(chatClient);
    }
}
